package com.maiko.maikoaiagent.tools;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * WebSearchTool 是一个基于 SearchAPI 的网页搜索工具类，
 * 支持通过指定的搜索引擎（如百度）进行关键词查询，并返回搜索结果。
 * 本类主要用于调用第三方搜索接口，封装搜索请求和结果解析逻辑。
 *
 * 使用说明：调用 {@link #searchWeb(String)} 方法传入查询关键词，即可返回前五条搜索结果。
 *
 * 依赖：使用了 Hutool 工具库中的 HttpUtil 和 JSONUtil 工具类。
 *
 * @author Maiko7
 * @create 2025-07-09 15:02
 */
public class WebSearchTool {

    /**
     * SearchAPI 的搜索接口地址。
     */
    private static final String SEARCH_API_URL = "https://www.searchapi.io/api/v1/search";

    /**
     * SearchAPI 的 API 密钥，用于认证请求。
     */
    private final String apiKey;

    /**
     * 构造方法，传入 API 密钥初始化搜索工具。
     *
     * @param apiKey SearchAPI 的认证密钥
     */
    public WebSearchTool(String apiKey) {
        this.apiKey = apiKey;
    }

    /**
     * 使用百度搜索引擎进行网页搜索，返回前 5 条搜索结果。
     *
     * @param query 搜索关键词
     * @return JSON 字符串，包含前 5 条搜索结果；若出错则返回错误信息
     */
    @Tool(description = "Search for information from Baidu Search Engine")
    public String searchWeb(
            @ToolParam(description = "Search query keyword") String query) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("q", query);                // 搜索关键词
        paramMap.put("api_key", apiKey);         // API 密钥
        paramMap.put("engine", "baidu");         // 指定搜索引擎为百度
        try {
            // 发送 GET 请求获取搜索结果
            String response = HttpUtil.get(SEARCH_API_URL, paramMap);

            // 解析返回的 JSON 数据
            JSONObject jsonObject = JSONUtil.parseObj(response);
            JSONArray organicResults = jsonObject.getJSONArray("organic_results");

            // 提取前 5 条结果并拼接为字符串
            List<Object> objects = organicResults.subList(0, 5);
            String result = objects.stream().map(obj -> {
                JSONObject tmpJSONObject = (JSONObject) obj;
                return tmpJSONObject.toString();
            }).collect(Collectors.joining(","));

            return result;
        } catch (Exception e) {
            // 异常处理，返回错误信息
            return "Error searching Baidu: " + e.getMessage();
        }
    }
}


